package de.uni_bremen.exceptions.oops;

/**
 * Die abstrakte Basisklasse für alle Anweisungen im Syntaxbaum.
 */
abstract class Statement
{
	/**
	 * Prüft, ob auf allen Pfaden <b>RETURN</b> erreicht wird.
	 */
	boolean returns()
	{
		return false;
	}
	
	/**
	 * Die Methode wertet den Statement auf konstante Ausdrücke aus.
	 */
	abstract void evaluateExpressions();
	
	/**
	 * Die Methode führt die Kontextanalyse für diese Anweisung durch.
	 * 
	 * @param declarations
	 *            Die an dieser Stelle gültigen Deklarationen.
	 * @throws CompileException
	 *             Während der Kontextanylyse wurde ein Fehler gefunden.
	 */
	abstract void contextAnalysis(Declarations declarations) throws CompileException;
	
	/**
	 * Die Methode gibt diese Anweisung in einer Baumstruktur aus.
	 * 
	 * @param tree
	 *            Der Strom, in den die Ausgabe erfolgt.
	 */
	abstract void print(TreeStream tree);
	
	/**
	 * Die Methode generiert den Assembler-Code für diese Anweisung. Sie geht davon aus, dass die Kontextanalyse vorher
	 * erfolgreich abgeschlossen wurde.
	 * 
	 * @param code
	 *            Der Strom, in den die Ausgabe erfolgt.
	 */
	abstract void generateCode(CodeStream code);
}
